package cn.handong.tool.algorithm;
// We have imported the necessary tool classes.
// If you need to import additional packages or classes, please import here.

import java.util.*;

public class Main {
//    public static void main(String[] args) {
    // please define the JAVA input here. For example: Scanner s = new Scanner(System.in);
    // please finish the function body here.
    // please define the JAVA output here. For example: System.out.println(s.nextInt());
//        Scanner s = new Scanner(System.in);
//        Integer M = s.nextInt(); // 当前生命值
//        Integer N = s.nextInt(); // 吊桥长度
//        Integer K = s.nextInt(); // 缺失木板数
//        Integer[] L = new Integer[K]; // 缺失木板编号数组 1 N
//        for (int i = 0; i < L.length; i++) {
//            L[i] = s.nextInt();
//        }

//    }

//    public static void main(String[] args) {
//        Scanner in = new Scanner(System.in);
//        String arrStr = in.nextLine();
//        String[] arrs = arrStr.split(",");
//        int[] arr = new int[arrs.length];
//        for (int i = 0; i < arr.length; i++) {
//            arr[i] = Integer.parseInt(arrs[i]);
//        }
//        List list = sort(arr);
//        for (int i = 0; i < list.size(); i++) {
//            System.out.print(list.get(i));
//            if (i != list.size() - 1){
//                System.out.print(",");
//            }
//        }
//    }
//
//    public static List sort(int[] arr){
//        LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
//        for (int ar : arr) {
//            map.merge(ar, 1, Integer::sum);
//        }
//        List<Map.Entry<Integer,Integer>> list = new ArrayList<>(map.entrySet());
//        list.sort((o1, o2) -> o2.getValue() - o1.getValue());
//        List vs = new ArrayList();
//        for (Map.Entry e : list) {
//            vs.add(e.getKey());
//        }
//        return vs;
//    }


//    public static void main(String[] args) {
//        Scanner in = new Scanner(System.in);
//        int N = in.nextInt();
//        int E = in.nextInt();
//        int s = 0;
//        int x = 0, offsety = 0;
//        int x0 = 0, y0 = 0;
//        while (N > 0){
//            x = in.nextInt();
//            offsety = in.nextInt();
//            s += Math.abs(y0) * Math.abs(x - x0);
//            x0 = x;
//            y0 += offsety;
//            N --;
//        }
//        s += Math.abs(E - x0) * Math.abs(y0);
//        System.out.print(s);
//    }


    /**
     * 第一行输入n，n表示石碑碎片的个数。
     * 第二行依次输入石碑碎片上的文字内容s，共有n组。
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String[] strings = new String[n];
        for (int i = 0; i < n; i++) {
            strings[i] = in.next();
        }
        Arrays.sort(strings);
        List<String> res = new ArrayList<>();
        boolean[] beUsed = new boolean[n];
        backtrack(strings,res,new HashSet<>(), new ArrayList<>(), beUsed);
        for (String an : res) {
            System.out.println(an);
        }
    }

    private static void backtrack(String[] strings, List<String> res, Set<String> aSet, List<String> path, boolean[] beUsed) {
        if (path.size() == strings.length){
            String paths = String.join("", path);
            if (!aSet.contains(paths)){
                res.add(paths);
                aSet.add(paths);
            }
            return;
        }
        for (int i = 0; i < strings.length; i++) {
            if (beUsed[i] || (i > 0 && strings[i].equals(strings[i-1]) && !beUsed[i - 1])){
                continue;
            }
            beUsed[i] = true;
            path.add(strings[i]);
            backtrack(strings,res,aSet,path,beUsed);
            beUsed[i] = false;
            path.remove(path.size() - 1);
        }
    }


}
